{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "prescription-lighter",
   "metadata": {},
   "source": [
    "# 未知量子态的经典影子"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "loaded-consultation",
   "metadata": {},
   "source": [
    "<em> Copyright (c) 2021 Institute for Quantum Computing, Baidu Inc. All Rights Reserved. </em>"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "comfortable-guidance",
   "metadata": {},
   "source": [
    "## 概览"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cellular-armstrong",
   "metadata": {},
   "source": [
    "对于一个未知量子系统中的量子态 $\\rho$，如何去获取它所包含的信息是一个十分基础且重要的问题。本教程将讨论如何通过经典影子（classical shadow） 技术用经典的数据来描述一个未知的量子态，从而可以高效地对该量子态的诸多性质进行有效估计。在 NISQ （noisy intermediate-scale quantum）时代，这个技术可以很好地帮助我们用经典资源来交换量子资源，在将量子态的信息用经典数据描述后，可以用经典机器学习等方法来解决一些量子问题。并且利用这个方法，一些现有的变分量子算法（例如变分量子本征求解器（variational quantum eigensolver, VQE））实现中的量子电路运行次数等代价将减小，进而提升算法的速度。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "stainless-enemy",
   "metadata": {},
   "source": [
    "## 经典影子"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7020ecd5",
   "metadata": {},
   "source": [
    "经典影子的直觉来源于现实生活中的影子。我们用一束光垂直照向一个多面体，会在桌面上得到一个它的影子，旋转这个多面体，我们可以看到它不同形状的影子。在多次旋转后，这一系列的影子很自然地就反映了这个多面体的一些信息。类似地，在量子世界，如果我对一个量子态进行一次酉变换，然后进行一次测量，是否也能得到一个量子态的“影子”？经典影子的构建就和这个例子有相似之处，它的过程如下：\n",
    "\n",
    "首先，我们对 $n$ 个量子比特系统中的一个未知量子态 $\\rho$ 作用一个酉变换：$\\rho \\mapsto U \\rho U^{\\dagger}$ ，然后用计算基态去对每个量子位做测量。对于测量的结果这里用 $|\\hat{b}\\rangle$ 举例解释：对 $|\\hat{b}\\rangle$ 进行之前酉变换的逆变换得到 $U^{\\dagger}|\\hat{b}\\rangle\\langle\\hat{b}|U$。我们知道，测得的量子态 $|\\hat{b}\\rangle\\langle\\hat{b}|$ 在计算基态下的期望为：\n",
    "\n",
    "$$\n",
    "\\mathbb{E}(|\\hat{b}\\rangle\\langle\\hat{b}|) =  \\sum_{b \\in \\{0,1\\}^{n}} \\operatorname{Pr}(|\\hat{b}\\rangle\\langle\\hat{b}| = |b\\rangle\\langle b|)\\cdot |b\\rangle \\langle b|=  \\sum_{b \\in \\{0,1\\}^{n}}\\langle b|U\\rho U^{\\dagger} |b\\rangle |b\\rangle \\langle b|. \\tag{1}\n",
    "$$\n",
    "\n",
    "那么进行了逆操作后，$U^{\\dagger}|\\hat{b}\\rangle\\langle\\hat{b}|U$ 的期望就是 $\\sum_{b \\in \\{0,1\\}^{n}}\\langle b|U\\rho U^{\\dagger} |b\\rangle U^{\\dagger}|b\\rangle \\langle b|U$。在这个过程中，酉变换 $U$ 是从一个固定的集合中随机选取。当我们重复这一过程，对每次随机选取的 $U$ 也求平均时，可以得到：\n",
    "\n",
    "$$\n",
    "\\mathbb{E}_{U \\sim \\mathcal{U}\\left(n\\right)}(\\mathbb{E}(U^{\\dagger}|\\hat{b}\\rangle\\langle\\hat{b}|U))=\\sum_{b \\in \\{0,1\\}^{n}}\\mathbb{E}_{U \\sim \\mathcal{U}\\left(n\\right)}(\\langle b|U\\rho U^{\\dagger} |b\\rangle U^{\\dagger}|b\\rangle \\langle b|U), \\tag{2}\n",
    "$$ \n",
    "\n",
    "其中 $\\mathcal{U}\\left(n\\right)$ 是给定的一个作用在 $n$ 个量子比特上的酉变换集合。\n",
    "\n",
    "如果把这个期望的结果记作 $\\mathcal{M}(\\rho)$ ，则 $\\mathcal{M}$ 将会是一个从 $\\rho$ 到 $\\mathcal{M}(\\rho)$ 的映射。当 $\\mathcal{M}$ 线性可逆时 [1]，初始的量子态 $\\rho$ 就可以表达为\n",
    "\n",
    "$$\n",
    "\\rho=\\mathcal{M}^{-1}(\\mathbb{E}_{U \\sim \\mathcal{U} \\left(n\\right)}(\\mathbb{E}(U^{\\dagger}|\\hat{b}\\rangle\\langle \\hat{b}|U))) = \\mathbb{E}_{U \\sim \\mathcal{U} \\left(n\\right)}(\\mathbb{E}(\\mathcal{M}^{-1} (U^{\\dagger}|\\hat{b}\\rangle\\langle \\hat{b}|U))). \\tag{3}\n",
    "$$\n",
    "\n",
    "有了 $\\mathcal{M}^{-1}$后，每一次采样 $U$ ，对 $U^{\\dagger}|\\hat{b}\\rangle\\langle\\hat{b}|U$ 作用 $\\mathcal{M}^{-1}$ 的结果 $\\hat{\\rho} = \\mathcal{M}^{-1}(U^{\\dagger}|\\hat{b}\\rangle\\langle\\hat{b}|U)$ 被我们称为 $\\rho$ 的一个快照（snapshot），重复这个过程 $N$ 次后得到 $N$ 个关于 $\\rho$ 的快照的集合：\n",
    "\n",
    "$$\n",
    "\\text{S}(\\rho ; N)=\\{\\hat{\\rho}_{1}=\\mathcal{M}^{-1}(U_{1}^{\\dagger}|\\hat{b}_{1}\\rangle\\langle\\hat{b}_{1}| U_{1}), \\ldots, \\hat{\\rho}_{N}=\\mathcal{M}^{-1}(U_{N}^{\\dagger}|\\hat{b}_{N}\\rangle\\langle\\hat{b}_{N}| U_{N})\\}. \\tag{4}\n",
    "$$\n",
    "\n",
    "我们把 $\\text{S}(\\rho; N)$ 就称为 $\\rho$ 的经典影子。值得一提的是，$\\mathcal{M}$ 具体是什么取决于我们选取的采样集合 $\\mathcal{U}$，例如当该集合选定为 Clifford 群时，我们有: \n",
    "\n",
    "$$\n",
    "\\mathcal{M}(\\rho)=\\mathbb{E}_{U \\sim \\operatorname{Cl} \\left(n\\right)}(\\mathbb{E}(U^{\\dagger}|\\hat{b}\\rangle\\langle \\hat{b}|U)) = \\frac{1}{2^{n}+1}\\rho+\\frac{1}{2^{n}+1}I. \\tag{5}\n",
    "$$\n",
    "\n",
    "（有关 $\\mathcal{M}$ 的表达式为何如（5）所示，读者可以参考 [1]）。于是：\n",
    "\n",
    "$$\n",
    "\\mathcal{M}^{-1}(\\frac{1}{2^{n}+1}\\rho+\\frac{1}{2^{n}+1}I)=\\rho \\Rightarrow \\mathcal{M}^{-1}(\\rho) = (2^{n}+1)\\rho-I. \\tag{6}\n",
    "$$\n",
    "\n",
    "构建了经典影子之后，它是如何帮助我们有效估计量子态的性质的呢？[1] 中指出，关于量子态 $\\rho$ 的一些线性性质就十分适合用经典影子技术来估计，例如 $\\rho$ 在某个可观测量 $\\mathcal{O}$ 下的期望：$o=\\operatorname{tr}\\left(\\mathcal{O} \\rho\\right)$，我们记 $\\hat{o}=\\operatorname{tr}\\left(\\mathcal{O} \\hat{\\rho}\\right)$，那么根据（3）式，就有 $\\mathbb{E}[\\hat{o}]=\\operatorname{tr}\\left(\\mathcal{O} \\rho\\right)$。与之相关的应用与实现，读者可以阅读另一篇教程：[基于经典影子的量子态性质估计](./ClassicalShadow_Application_CN.ipynb)。\n",
    "\n",
    "接下来，我们将在量桨中展示对一个随机生成的量子态 $\\rho$ 构建其经典影子的过程，帮助读者更好地理解与感受经典影子这个技术。其中选取 Clifford 群作为酉变换的采样集合（具体有关 Clifford 群的性质以及如何从中均匀随机采样 Clifford 变换，感兴趣的读者可以参考 [1]、[3] 以及量桨中的 `Clifford` 类）。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "chinese-talent",
   "metadata": {},
   "source": [
    "## Paddle Quantum 代码实现"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "proved-hypothesis",
   "metadata": {},
   "source": [
    "首先，我们导入需要用到的包。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "freelance-steps",
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import paddle\n",
    "import matplotlib.pyplot as plt\n",
    "import paddle_quantum as pq\n",
    "from paddle_quantum.qinfo import trace_distance\n",
    "from paddle_quantum.state import to_state"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "blessed-italian",
   "metadata": {},
   "source": [
    "接下来，我们随机生成量子态 $\\rho$。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "39527cf9",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 设置量子比特数目\n",
    "n_qubit = 2\n",
    "pq.set_backend('density_matrix')\n",
    "\n",
    "# 随机生成纯态 rho\n",
    "rho_random = pq.state.random_state(n_qubit, rank=1) \n",
    "\n",
    "# 定义 |0> 和 |1>\n",
    "ket_0 = np.array([[1,0]]).T\n",
    "ket_1 = np.array([[0,1]]).T\n",
    "\n",
    "# 定义单位矩阵与 M 逆的系数\n",
    "I = np.eye(2**n_qubit)\n",
    "coefficient = float(2**n_qubit + 1)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "painful-crossing",
   "metadata": {},
   "source": [
    "下一步，我们定义在测量时所需要的电路，并对我们记录测量结果做一些准备。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "dependent-abortion",
   "metadata": {},
   "outputs": [],
   "source": [
    "def measure_by_clifford(phi, num_qubit):\n",
    "    \"\"\"\n",
    "    对 phi 进行 Clifford 变换后，进行计算基态下的测量\n",
    "    \"\"\"\n",
    "    # 通过 Paddle Quantum 的 Clifford 类，来随机选取一个 Clifford operator，并生成其电路\n",
    "    clif = pq.gate.clifford.Clifford(num_qubit)\n",
    "    # 运行电路\n",
    "    cir = clif.circuit()\n",
    "    # 获取电路的酉矩阵形式\n",
    "    cl = cir.unitary_matrix().numpy()\n",
    "    # 对这一次采样后的运行结果进行一次测量\n",
    "    result = cir(phi).measure(shots=1)\n",
    "    bitstring = [k for k, v in result.items() if v == 1.0]\n",
    "    # 将测量的比特串结果记成态矢量形式\n",
    "    bhat = [[1.]]\n",
    "    for i in bitstring[0]:\n",
    "        if i == '0':\n",
    "            bhat = np.kron(bhat, ket_0)\n",
    "        elif i == '1':\n",
    "            bhat = np.kron(bhat, ket_1)\n",
    "    return bhat, cl"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "collect-fellow",
   "metadata": {},
   "source": [
    "### 进行酉变换的采样与经典影子的构建"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "authorized-welcome",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 选定采样次数\n",
    "S = 800"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "specified-balloon",
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "estimator_rho = []\n",
    "tracedistance = []\n",
    "\n",
    "for sample in range(S):\n",
    "    \n",
    "    bhat, cl = measure_by_clifford(rho_random, n_qubit)\n",
    "\n",
    "    # 根据推导的 M 逆来得到 shadow\n",
    "    hat_rho = coefficient * cl.conj().T @ bhat @ bhat.T @ cl - I\n",
    "    estimator_rho.append(hat_rho)\n",
    "    \n",
    "    # 对 shadow 求平均（因为在实际操作中，我们不能实现（3）式中的求期望，只能对得到的 classical shadow 求平均来近似）\n",
    "    ave_estimate = sum(estimator_rho) / len(estimator_rho)\n",
    "    # 计算迹距离\n",
    "    tracedistance.append(trace_distance(rho_random, to_state(paddle.to_tensor(ave_estimate))).numpy())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "boolean-overview",
   "metadata": {},
   "source": [
    "最后，我们输出用经典影子近似的 $\\rho$ 与真实 $\\rho$ 的矩阵表示，以及他们的迹距离。迹距离越接近 0 则说明用经典影子近似的 $\\rho$ 越接近真实的量子态。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "german-columbia",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "输出的量子态近似： [[0.159+0.j    0.241+0.131j 0.244-0.025j 0.234+0.056j]\n",
      " [0.241-0.131j 0.409+0.j    0.209-0.125j 0.431-0.019j]\n",
      " [0.244+0.025j 0.209+0.125j 0.078+0.j    0.234+0.175j]\n",
      " [0.234-0.056j 0.431+0.019j 0.234-0.175j 0.353+0.j   ]]\n",
      "--------------------------------------------------\n",
      "初始输入的量子态： [[0.109+0.j    0.175+0.135j 0.124-0.02j  0.146+0.106j]\n",
      " [0.175-0.135j 0.449+0.j    0.173-0.186j 0.366-0.011j]\n",
      " [0.124+0.02j  0.173+0.186j 0.144+0.j    0.146+0.148j]\n",
      " [0.146-0.106j 0.366+0.011j 0.146-0.148j 0.298+0.j   ]]\n",
      "量子态近似与真实量子态的迹距离： 0.258\n"
     ]
    }
   ],
   "source": [
    "print('输出的量子态近似：', np.around(ave_estimate, decimals=3))\n",
    "print('-' * 50)\n",
    "print('初始输入的量子态：', np.around(rho_random.numpy(), decimals=3))\n",
    "print('量子态近似与真实量子态的迹距离：', np.around(tracedistance[-1][0], decimals=3))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "independent-inspiration",
   "metadata": {},
   "source": [
    "可以看到，用经典影子近似的 $\\rho$ 与真实的量子态 $\\rho$ 在矩阵表示上已经十分接近，在 800 次的采样左右，两者的迹距离已经在 0.2 左右。下图展示了迹距离随着采样次数增多而下降的关系。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "superb-merchandise",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAmkAAAJVCAYAAACFyWIEAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAABUiElEQVR4nO3dd5xU1f3/8fdnKQvLAgICKihFMQaNICBoLAFLxBJJjDXGbkjRGPINifVnTWI0SjSxxRhjS4KJLbZoLKAYW6iKgFJUBEFEpXf28/vj3GWHZXfZGe6dO7vzej4e85iZe+/MfM7M7O57z7n3HnN3AQAAoLCUpF0AAAAAtkRIAwAAKECENAAAgAJESAMAAChAhDQAAIACREgDAAAoQE3TLiBu22+/vXfv3j3x11m5cqVatWqV+OsUomJuu1Tc7S/mtkvF3X7aXpxtl4q7/flo+4QJExa7e8ea1jW6kNa9e3eNHz8+8dcZO3asBg8enPjrFKJibrtU3O0v5rZLxd1+2j447TJSU8ztz0fbzezD2tYx3AkAAFCACGkAAAAFiJAGAABQgAhpAAAABYiQBgAAUIAa3dGdAABka9myZVq0aJHWr1+/xbq2bdtq+vTpKVRVGIq5/dva9mbNmqlTp05q06ZNTo8npAEAitqyZcv0ySefqEuXLmrZsqXMbLP1y5cvV+vWrVOqLn3F3P5tabu7a/Xq1Zo/f74k5RTUGO4EABS1RYsWqUuXLiorK9sioAG5MjOVlZWpS5cuWrRoUU7PQUgDABS19evXq2XLlmmXgUaqZcuWNQ6j1wchDQBQ9OhBQ1K25btFSAMAAChAhDQAAJBX559//mZzYp555pk65phj0iuoQBHSAABogAYPHqzzzz8/7TJicfPNN+uBBx6o17b33HOPysvLE66oMHAKDgAAGqn169erWbNmaZexVW3btk27hIJETxoAAA3MmWeeqZdeekm33nqrzExmpnvuuUdmpqeffloDBw5U8+bN9eyzz2r27NkaNmyYdthhB7Vq1Ur9+vXTk08+udnzrVu3Tpdccom6deum0tJS9ezZU7///e83rZ82bZqOPvpotW7dWp06ddIpp5yihQsX1qvWjRs3auTIkWrXrp3atWunESNGaOPGjVu0J3O48+WXX9Z+++2n8vJytW3bVgMHDtTUqVM1duxYnXXWWVq5cuWmdl955ZWSpAceeED77rvvphpPOOGETecok6SxY8fKzPTCCy9o0KBBKisr04ABAzRx4sTNann99dd1yCGHqFWrVuratasOOeQQffzxx5LCuc+uv/567brrrmrZsqW+8pWv1LsHMBeENAAAGpibb75Z+++/v8466ywtWLBACxYs0M477yxJuvDCC/XLX/5SM2bM0KBBg7RixQodeeSReu655zRlyhR9+9vf1nHHHacZM2Zser4zzjhD9913n0aNGqXp06frz3/+s7bbbjtJ0sKFC3XwwQdrr7320ptvvqnnn39eK1as0LBhw1RRUbHVWm+88Ub96U9/0h//+Ee99tpr2rhxo/7617/Wuv2GDRs0bNgwHXjggZoyZYreeOMNjRgxQk2aNNFXv/pV3XTTTSorK9vU7pEjR0oKQfOqq67SlClT9OSTT2rx4sU65ZRTtnj+iy++WL/5zW80ceJEdejQQaeeeqrcXZI0ZcoUDRkyRLvttpv++9//6oUXXtBJJ52kDRs2SJIuu+wy/fnPf9att96qadOm6eKLL9b3v/99PfXUU/X74LLEcCcAANWNGCFNnixJarlxo9SkSfKv2bevdNNN9dq0bdu2at68ucrKyrTDDjtI0qbQdeWVV+rrX//6pm07duyoPn36bLp/6aWX6oknntBDDz2kyy67TDNnztTo0aP173//W0OHDpUk9ezZc9P2d911l/r06aPrrrtu07L77rtP7du31/jx4zVw4MA6a73pppv0i1/8QieeeKKkEDCfffbZWrdftmyZlixZom984xvaddddJUl77LHHZm03s03trnT22Wdvut2zZ0/dfvvt+vKXv6x58+apa9eum9Zdc801GjJkiCTp8ssv14EHHqj58+era9euuv7669W3b1/deeedksKMAwMGDJAkrVy5UqNGjdJ//vMfHXTQQZKkHj166M0339Stt96qo48+us73IRf0pAEA0IhUhopKK1eu1C9+8Qv17t1b7dq1U3l5ucaPH6+5c+dKkiZNmqSSkpJNwaW6yZMn6+WXX1Z5efmmS2Wv3ezZs+usZenSpVqwYIH233//TctKSko0aNCgWh/Tvn17nXnmmTriiCN09NFHa9SoUZtqrcvEiRM1bNgwdevWTa1bt970PlR/7N57773p9k477SRJm2YEmDRpkg455JAan3/atGlas2aNhg4dutl7cfvtt2/1fcgVPWkAAFSX0aO1uoHNXdmqVavN7o8cOVLPPPOMbrjhBvXq1UtlZWU6/fTTtW7duno9X0VFhY4++mjdcMMNW6zr3LlzLDVX95e//EUjRozQM888o8cff1yXXnqpHnvsMR1xxBE1br9y5UodccQROuyww3T//ferU6dOWrx4sQ466KAt2pl5IEXliWbrM2xbuc0TTzyhXXbZpdbnjBMhDQCABqh58+Zb7IBfk1deeUWnn366vv3tb0uS1qxZo9mzZ2v33XeXJPXt21cVFRUaM2bMpuHOTH379tVjjz2mbt26ZR1G2rZtqx133HHTzvhS2Pn+zTff1I477ljnY/v06aM+ffrowgsv1JFHHql7771XRxxxRI3tnjFjhhYvXqxf//rX6tGjhyTpkUceyapWSdpnn3304osv1riud+/eKi0t1Ycfflhrb1vcGO4EAKAB6t69u95880198MEHWrx4ca29QbvvvrseffRRTZw4UW+//ba++93vas2aNZutP/HEE3Xuuefq4Ycf1vvvv69x48bp/vvvlyR973vf09KlS3XSSSfpjTfe0Jw5c/T8889r+PDhWr58+Vbr/MlPfqLrr79eDz30kN59912NGDFCCxYsqHX7999/XxdddJFeffVVffjhhxozZozeeust9e7de1O716xZo+eee06LFy/WqlWrtMsuu6i0tFS33HKL5syZo6eeekr/7//9v2zeTknSz3/+c02aNEnDhw/XlClTNHPmTN11112aO3euWrdurZEjR2rkyJG6++67NWvWLE2ePFl33HHHpn3Y4kZIAwCgARo5cqSaN2+u3r17q2PHjrXutzVq1Ch16tRJBx10kI488kjtt99+m3Z8r3TffffpO9/5ji644ALtscceOvPMM7V06VJJ0o477qj//ve/Kikp0dChQ7XnnnvqvPPOU2lpqUpLS7da589+9jOdddZZOvfcczVo0CBVVFTo1FNPrXX7srIyvffeezrhhBO0++6764wzztCpp56qCy+8UJL01a9+VT/4wQ90yimnqGPHjrr++uvVsWNH3XvvvXrsscfUu3dvXXXVVRo1alR938pN+vbtq+eff14zZszQfvvtp0MOOUSjR4/e1IN4zTXX6Morr9QNN9ygPffcU4cffrgefvjhTb13cbPKw07zzcxaSHpZUqnCsOtD7n5FtW3OlPRbSZUn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",
      "text/plain": [
       "<Figure size 720x720 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 打印出量子态的近似与初始量子态的迹距离结果图\n",
    "fig,ax = plt.subplots(figsize=(10, 10))\n",
    "plt.xlabel('number of samples', fontsize=18)\n",
    "plt.ylabel('trace distance', fontsize=18)\n",
    "j = range(len(tracedistance)) \n",
    "plt.plot(j, tracedistance, 'r', label=\"trace_distance\")\n",
    "\"\"\"open the grid\"\"\"\n",
    "plt.grid(True)\n",
    "plt.legend(fontsize=14)\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "graphic-oklahoma",
   "metadata": {},
   "source": [
    "## 总结"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "unavailable-health",
   "metadata": {},
   "source": [
    "本教程介绍了经典影子的基本原理与一些理论知识。在展示的案例中，我们基于量桨对一个随机生成的 2 个量子比特量子态构建了其经典影子。直观地感受了经典影子可以对一个未知的量子态做较好的近似。事实上，[2] 中指出在许多场景下，要求对量子系统进行完整的经典描述可能是多余的。相反，准确地估计量子系统的某些特性通常就足够了，这也是经典影子真正的重要性所在。在经典影子应用的教程（[基于经典影子的量子态性质估计](./ClassicalShadow_Application_CN.ipynb)）中，将具体介绍经典影子的应用以及如何在量桨中使用 shadow 功能。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "adopted-taste",
   "metadata": {},
   "source": [
    "## 参考文献"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "described-swiss",
   "metadata": {},
   "source": [
    "[1] Huang, Hsin-Yuan, Richard Kueng, and John Preskill. \"Predicting many properties of a quantum system from very few measurements.\" [Nature Physics 16.10 (2020): 1050-1057.](https://authors.library.caltech.edu/102787/1/2002.08953.pdf)\n",
    "\n",
    "[2] Aaronson, Scott. \"Shadow tomography of quantum states.\" [SIAM Journal on Computing 49.5 (2019): STOC18-368.](https://dl.acm.org/doi/abs/10.1145/3188745.3188802)  \n",
    "\n",
    "[3] Bravyi, Sergey, and Dmitri Maslov. \"Hadamard-free circuits expose the structure of the Clifford group.\" [IEEE Transactions on Information Theory 67.7 (2021): 4546-4563.](https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9435351)"
   ]
  }
 ],
 "metadata": {
  "interpreter": {
   "hash": "0c785fa01a45293a2a325c4fa624f41b05f7fdafa1fed21e8d0fe069247007dc"
  },
  "kernelspec": {
   "display_name": "Python 3.8.13 ('new_pq')",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
